<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of ManagerPaginado
 *
 * @author jhonny
 */
class ManagerPaginado extends ManagerParam{
    private $pagina;
    private $cantidadPorPagina;
    private $cantidadPaginas;
    private $parametros;
    private $strParametros;
    private $paginaItems;
    private $cantidadPaginasMostradas;
    private $preUrl;

    public function __construct($sfActions,$pagina,$cantidadPorPagina,$cantidadPaginasMostradas,$parametros,$strParametros) {
        parent::__construct($sfActions);
        $this->pagina = $pagina;
        $this->cantidadPorPagina = $cantidadPorPagina;
        $this->parametros = $parametros;
        $this->strParametros = $strParametros;
        $this->cantidadPaginas = 1;
        $this->cantidadPaginasMostradas = $cantidadPaginasMostradas;
        $this->paginaItems = array();
        $this->preUrl = "/frontend_dev.php/search/index/";
    }

    public function haveToPaginate() {
        return true;
    }
    public function generar() {
        $this->cantidadPaginas = 1;
        $cantidad = Doctrine_Core::getTable('Institucion')->getCount($this->parametros);
        if($cantidad>0){
            if($this->cantidadPorPagina==0){
                $this->cantidadPorPagina = sfConfig::get('app_max_instituciones_on_filters');
            }
            $this->cantidadPaginas = ceil($cantidad/$this->cantidadPorPagina);
        }
        //$this->cantidadPaginas = 10;
        $this->generateItemPaginado();
    }
    private function generateItemPaginado(){
        $href = "";
        $titulo = "";
        $numeroLoadPage = 1;
        $classLink = "";
        $texto = "";
        $isFirst = false;
        $isLast = false;
        $borde = false;
        $isSeleccionado = false;
        $spamClass = "";
        $itemSeleccionado = false;
        $itemSeleccionadoFirst = false;
        $itemSeleccionadoLast = false;
        $numeroAnterior = 1;
        $numeroSiguiente = 1;
        $i = 1;
        $count=1;
        
        $step = floor($this->pagina/$this->cantidadPaginasMostradas);
        if($this->pagina>=$this->cantidadPaginasMostradas){
            $i = $this->cantidadPaginasMostradas*($step);
        }
        $this->logMessage("cantidad de paginas step $step pagina $this->pagina ", "info");
        for ($i,$count ; $i<=$this->cantidadPaginas && $count<=$this->cantidadPaginasMostradas ; $i++,$count++){
            $this->logMessage("i $i count $count cantidad de paginas $this->cantidadPaginas cantidad de paginas mostradas $this->cantidadPaginasMostradas", "info");
            $itemSeleccionado = false;
            $itemSeleccionadoFirst = false;
            $itemSeleccionadoLast = false;

            if($this->pagina==$i){
                // el item es el que esta seleccionado
                $itemSeleccionado = true;
            }
                $numeroAnterior = $this->pagina-1;
                $numeroSiguiente = $this->pagina + 1;
            
            if($count==1){
                $borde = true;
                //agrego el link al primero y al anterior
                if($this->pagina==1){
                    $itemSeleccionadoFirst = true;
                }
                $titulo = "Primero";
                $numeroLoadPage = 1;
                $href = $this->preUrl.$this->generateStrParametersPage($this->parametros, $numeroLoadPage);
                $classLink = "pri";
                $texto = "«";
                $isFirst = $itemSeleccionadoFirst;
                $isSeleccionado = $itemSeleccionadoFirst;
                $spamClass = "pri";        

                $this->addItemPaginado($this->paginaItems, $href, $titulo, $numeroLoadPage, $classLink, $texto, $isSeleccionado, $spamClass,$borde, $isFirst, $isLast);
                
                $titulo = "Anterior";
                $numeroLoadPage = $numeroAnterior;
                $href = $this->preUrl.$this->generateStrParametersPage($this->parametros, $numeroLoadPage);
                $classLink = "ant";
                $texto = "« Anterior";
                $isFirst = $itemSeleccionadoFirst;
                $isSeleccionado = $itemSeleccionadoFirst;
                $spamClass = "ant";
                $this->addItemPaginado($this->paginaItems, $href, $titulo, $numeroLoadPage, $classLink, $texto, $isSeleccionado, $spamClass,$borde, $isFirst, $isLast);
            }
            $isFirst = false;
            if($this->pagina==1){
                //es la primer pagina
                $isFirst = true;
            }
            $isLast = false;
            if($this->pagina==$this->cantidadPaginas){
                // es la ultima pagina
                $isLast = true;
            }
            
            $titulo = $i;
            $borde = false;
            $numeroLoadPage = $i;
            $href = $this->preUrl.$this->generateStrParametersPage($this->parametros, $numeroLoadPage);
            $classLink = "sig";
            $texto = $i;
            $isSeleccionado = $itemSeleccionado;
            $spamClass = "ant";
            $this->addItemPaginado($this->paginaItems, $href, $titulo, $numeroLoadPage, $classLink, $texto, $isSeleccionado, $spamClass,$borde, $isFirst, $isLast);          
            if($count==$this->cantidadPaginasMostradas || $i==$this->cantidadPaginas ){
                //agrego el link al siguiente y al ultimo
                $borde = true;
                if($this->cantidadPaginas==$this->pagina){
                    $itemSeleccionadoLast = true;
                }
                $titulo = "Siguiente";
                $numeroLoadPage = $numeroSiguiente;
                $href = $this->preUrl.$this->generateStrParametersPage($this->parametros, $numeroLoadPage);
                $classLink = "sig";
                $texto = "Siguiente »";                
                $isSeleccionado = $itemSeleccionadoLast;
                $spamClass = "sig";        

                $this->addItemPaginado($this->paginaItems, $href, $titulo, $numeroLoadPage, $classLink, $texto, $isSeleccionado, $spamClass,$borde, $isFirst, $isLast);
                
                $titulo = "Último";
                $numeroLoadPage = $this->cantidadPaginas;
                $href = $this->preUrl.$this->generateStrParametersPage($this->parametros, $numeroLoadPage);
                $classLink = "ult";
                $texto = "»";                
                $isSeleccionado = $itemSeleccionadoLast;
                $spamClass = "ult";
                $this->addItemPaginado($this->paginaItems, $href, $titulo, $numeroLoadPage, $classLink, $texto, $isSeleccionado, $spamClass,$borde, $isFirst, $isLast);
            
            }
        }
        
                
    }
    private function addItemPaginado(&$list,$href,$titulo,$numeroLoadPage,$classLink,$texto,$isSeleccionado,$spamClass,$borde,$isFirst=false,$isLast=false){
        $item = $this->createItemPaginado($href, $titulo, $numeroLoadPage, $classLink, $texto, $isSeleccionado, $spamClass,$borde, $isFirst, $isLast);
        array_push($list, $item);
    }
    /**
     *
     * @param type $href
     * @param type $titulo
     * @param type $numeroLoadPage
     * @param type $classLink
     * @param type $texto
     * @param type $isSeleccionado
     * @param type $spamClass
     * @param type $isFirst
     * @param type $isLast
     * @return PaginaItem 
     */
    private function &createItemPaginado($href,$titulo,$numeroLoadPage,$classLink,$texto,$isSeleccionado,$spamClass,$borde,$isFirst=false,$isLast=false){
        $item = new PaginaItem();
        $item->setHref($href);
        $item->setTitulo($titulo);
        $item->setNumeroLoadPage($numeroLoadPage);
        $item->setClassLink($classLink);
        $item->setTexto($texto);
        $item->setIsFirst($isFirst);
        $item->setIsLast($isLast);
        $item->setSeleccionado($isSeleccionado);
        $item->setSpamClass($spamClass);
        $item->setBorde($borde);
        return $item;
    }
    public function getPagina() {
        return $this->pagina;
    }

    public function setPagina($pagina) {
        $this->pagina = $pagina;
    }

    public function getCantidadPorPagina() {
        return $this->cantidadPorPagina;
    }

    public function setCantidadPorPagina($cantidadPorPagina) {
        $this->cantidadPorPagina = $cantidadPorPagina;
    }

    public function getCantidadPaginas() {
        return $this->cantidadPaginas;
    }

    public function setCantidadPaginas($cantidadPaginas) {
        $this->cantidadPaginas = $cantidadPaginas;
    }

    public function getParametros() {
        return $this->parametros;
    }

    public function setParametros($parametros) {
        $this->parametros = $parametros;
    }

    public function getStrParametros() {
        return $this->strParametros;
    }

    public function setStrParametros($strParametros) {
        $this->strParametros = $strParametros;
    }
    public function getPaginaItems() {
        return $this->paginaItems;
    }

    public function setPaginaItems($paginaItems) {
        $this->paginaItems = $paginaItems;
    }
}

?>
